import java.io.Serializable;

/**
 * 实现一个动态数组，要求如下：
 * 1、这个数组内任何类型的元素都是可以保存的
 * 2、这个数组的它的长度不够的情况下可以自动扩容
 * 3、实现数组的CRUD，增删查改。
 */
public class MyArray implements Serializable {

    private Object[] data; // 用来保存元素的数组，Object类型任何数据都可以保存

    private int size; // 这个属性用来记录实际的长度。

    private int defaultLength = 5; // 数组默认的长度

    public MyArray() {
        data = new Object[defaultLength]; // 在这个对象初始化的时候给数组做初始化
    }

    // 添加元素
    public void add(Object ele) {
        // 找到一个空的位置，才能把新元素添加进去
        for (int i = 0; i < data.length; i++) {
            if (data[i] == null) { // 条件成功说明这个位置是空的
                data[i] = ele; // 把新元素给它保存到空的位置
                size++; // 记录元素的个数
                return; // 直接返回
            }
        }
        // 考虑数组的扩容操作
        Object[] newData = new Object[data.length * 2]; // 创建一个新数组长度是旧数组的2倍

        // 把旧数组的元素挪到新数组中
        for (int i = 0; i < data.length; i++) {
            newData[i] = data[i]; // 把旧数组中的元素全部挪到新数组中
        }
        // 使用新数组替换旧数组
        data = newData;
        // 再把新元素追加进去
        add(ele);
    }

    public int size() {
        return this.size;
    }

    public Object[] getDate() {

        // 创建一个临时数组,长度就是元素实际的长度
        Object[] array = new Object[size];

        // 把实际的元素给拷贝到临时数组中
        for (int i = 0; i < array.length; i++) {
            array[i] = data[i];
        }
        return array;
    }

    public Object get(int index) {
        // 角标不能是负数，也不能超过size
        if (index < 0 || index > size) {
            return null;
        }
        return data[index];
    }

    public void remove(int index) {
        for (int i = index; i < data.length; i++) {
            int current = i + 1;
            if (current < data.length) {
                data[i] = data[i + 1]; // 后面的往前挪一位
            } else {
                data[i] = null; // 最后一个设置为null
            }
        }
        size--; // 删除一个元素后，size需要减一
    }
}
